package cm.example.shoppingplatformspringboot.service;

import cm.example.shoppingplatformspringboot.entity.Invoice;
import cm.example.shoppingplatformspringboot.entity.Order;
import cm.example.shoppingplatformspringboot.entity.OrderItem;
import cm.example.shoppingplatformspringboot.mapper.OrderMapper;
import jakarta.annotation.Resource;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.util.*;

@Service
public class OrderService {
    @Resource
    private OrderMapper orderMapper;
    @Resource
    private GoodsService goodsService;
    @Resource
    private InvoiceService invoiceService;

    // 生成订单编号方法
    @NotNull
    public static String generateOrderNumber() {
        // 获取当前日期（格式为）
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        String datePart = dateFormat.format(new Date());

        // 生成 4 位随机数字
        Random random = new Random();
        String randomPart = String.format("%04d", random.nextInt(10000));

        // 拼接订单编号
        return "OD" + datePart + randomPart;
    }

    // 根据订单查询该订单下的详细信息，包括商品信息、发票信息等，并返回订单对象
    @NotNull
    private List<Order> getOrders(@NotNull List<Order> orders) {
        for (Order order : orders) {
            // 获取订单下的商品信息
            List<OrderItem> items = getOrderItems(order.getId());
            order.setItems(items);
            // 获取订单下的发票信息
            Invoice invoice = invoiceService.getInvoiceById(order.getId());
            order.setInvoice(invoice);
        }
        return orders;
    }

    // 创建订单方法
    @Transactional
    public int createOrder(@NotNull Order order) {
        order.setNo(generateOrderNumber()); // 生成订单编号
        order.setAdd_time(new Date()); // 设置订单创建时间
        order.setStatus("1"); // 默认状态为 '待支付'

        // 插入订单信息
        if (orderMapper.insertOrder(order) <= 0) {
            throw new RuntimeException("插入订单失败"); // 触发事务回滚
        }

        // 插入订单下商品信息，并减少库存
        for (OrderItem item : order.getItems()) {
            item.setOrder_id(order.getId());
            // 检查库存
            if (!goodsService.checkStock(item.getGoods_id(), item.getNum())) {
                throw new RuntimeException("库存不足"); // 触发事务回滚
            }
            // 插入订单项
            if (orderMapper.insertOrderItem(item) <= 0) {
                throw new RuntimeException("插入订单项失败"); // 触发事务回滚
            }
            // 减少库存
            goodsService.reduceStock(item.getGoods_id(), item.getNum());
        }
        // 创建发票（如果需要开局发票）
        Invoice invoiceData = order.getInvoice(); // 获取订单中的发票数据
        if (invoiceData != null) {
            invoiceData.setOrder_id(order.getId());  // 设置发票的订单ID
            int invoice = invoiceService.createInvoice(invoiceData);
            if (invoice == 0) {
                throw new RuntimeException("创建发票失败"); // 触发事务回滚
            }
        }
        // 获取自增ID（需确保MyBatis配置正确）
        return order.getId();
    }

    // 根据订单ID获取该订的商品信息
    public List<OrderItem> getOrderItems(Integer order_id) {
        return orderMapper.selectOrderItems(order_id);
    }

    // 根据订单编号获取订单
    public List<Order> getOrderByNo(String no) {
        List<Order> orders = orderMapper.selectOrderByNo(no);
        return getOrders(orders);
    }

    //获取所有订单列表
    public List<Order> getAllOrders() {
        List<Order> orders = orderMapper.selectAllOrders();
        return getOrders(orders);
    }

    //根据用户ID查询订单列表
    public List<Order> getOrderByUserId(Integer user_id) {
        List<Order> orders = orderMapper.selectOrderByUserId(user_id);
        return getOrders(orders);
    }

    // 根据订单状态查询所有订单列表
    public List<Order> getAllOrderByStatus(String status) {
        List<Order> orders = orderMapper.selectAllOrderByStatus(status);
        return getOrders(orders);
    }

    // 根据订单状态查询订单列表
    public List<Order> getOrderByStatus(Integer user_id, String status) {
        List<Order> orders = orderMapper.selectOrderByStatus(user_id, status);
        return getOrders(orders);
    }

    // 删除订单方法（标记为已删除）
    public boolean deleteOrder(Integer order_id) {
        Order order = orderMapper.selectOrderById(order_id);
        //判断订单是否存在且状态为待支付或已取消(0.已删除 1.待支付 2.已支付 3.已发货 4.已完成 5.已取消)
        if (order != null && ("1".equals(order.getStatus()) || "5".equals(order.getStatus()))) {
            return orderMapper.markOrderAsDeleted(order_id) > 0;
        }
        return false;
    }

    // 更新订单状态方法
    public boolean updateOrderStatus(Integer order_id, String status) {
        return orderMapper.updateOrderStatus(order_id, status) > 0;
    }

    // 更新订单地址方法（id为订单id）
    public boolean updateAddress(Order order) {
        return orderMapper.updateOrderAddress(order) > 0;
    }

    // 订单支付成功后更新订单支付时间
    public int updateOrderPayTime(Integer order_id) {
        return orderMapper.updateOrderPayTime(order_id);
    }

    // 订单发货后更新订单发货时间
    public int updateOrderSendTime(Integer order_id) {
        return orderMapper.updateOrderSendTime(order_id);
    }

    // 订单完成后更新订单完成时间
    public int updateOrderCompleteTime(Integer order_id) {
        return orderMapper.updateOrderCompleteTime(order_id);
    }
}